package com.zl_huang.example.aspect;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	@Pointcut("execution(* com.zl_huang.example.service.*.*create*(..)) || execution(* com.zl_huang.example.service.*.*edit*(..))")
	public void addOrEditMethod(){}
	@Before("addOrEditMethod()")
	public void beforeLog(){
		System.out.println("beforeLog--------前置通知");
	}
	@Around("addOrEditMethod()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("Around----------进入环绕通知");
		Object object = pjp.proceed();
		System.out.println("Around----------结束方法调用");
		return object;		
	}
	@After("addOrEditMethod()")
	public void afterLog(JoinPoint point){
		System.out.println("afterLog----------最终通知");
		System.out.println("afterLog----------目标方法为："+point.getSignature().getDeclaringTypeName()+"."+point.getSignature().getName());
		System.out.println("afterLog----------参数为："+Arrays.toString(point.getArgs()));
		System.out.println("afterLog----------被植入的目标对象为："+point.getTarget());
		
	}
	@AfterReturning(value = "addOrEditMethod()",returning = "returnValue")
	public void afterReturningLog(JoinPoint point , Object returnValue){
		System.out.println("afterReturningLog----------返回值后通知");
	    System.out.println("afterReturningLog----------目标方法为："+
		point.getSignature().getDeclaringTypeName()+"."+
	    		point.getSignature().getName());
	    System.out.println("afterReturningLog----------参数为："+
	    		Arrays.toString(point.getArgs()));
	    System.out.println("afterReturningLog----------返回值为："+
	    		returnValue);
	}
	@AfterThrowing(throwing = "ex" , value = "addOrEditMethod()")
	public void afterThrowingLog(Throwable ex){
		System.out.println("afterThrowingLog----------进入异常通知");
		System.out.println("afterThrowingLog----------异常信息为： "+ex.getMessage());
	}

}
